from django.db import models
from django.utils import timezone
from django.urls import reverse
from django.contrib.auth.models import User

from taggit.managers import TaggableManager
# Create your models here.

# 自己编写模型管理器
# 第一种给默认的管理器增加新的方法
# 第二种修修改默认的管理器
# post.object post.published
class PublishedManager(models.Manager):
    def get_queryset(self):
        return super(PublishedManager, self).get_queryset().filter(status="published")


# 每一个模型都有至少一个管理器，默认的管理器叫做objects
# 通过一个模型管理器可以得到一个QuerySet
class Post(models.Model):
    STATUS_CHOICES = (("draft", "草稿"), ("published", "发布"))
    title = models.CharField(max_length=50)
    # slug 字段通常在url中使用，slug是一个短的字符串，只能包含字母、数字、下划线和减号。也方便搜索引擎搜索, unique_for_date 参数表示不允许两条记录的publish字段日期都相同，这样就可以使用文章的发布日期与slug字段共同生成一个唯一的url标识文章
    slug = models.SlugField(max_length=50, unique_for_date="publish")
    # relate_name 参数设置了从User到Post的反向关联关系，用blog_posts为这个反向关联关系命名
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name="blog_posts")
    body = models.TextField()
    publish = models.DateTimeField(default=timezone.now)
    # auto_now_add 表示创建一行数据的时候，自动创建数据的时间填充
    created = models.DateTimeField(auto_now_add=True)
    # auto_now 表示每次更新数据的时候都会用当前时间填充该字段
    updated = models.DateTimeField(auto_now=True)
    status = models.CharField(max_length=10, choices=STATUS_CHOICES, default="draft")

    class Meta:
        db_table = "post"
        verbose_name = verbose_name_plural = "文章"
        ordering = ("-publish",)

    # str方法是python类的功能，显示给人阅读的信息，这里将其设置为文章的标题。比如管理后台中调用该方法显示对象信息
    def __str__(self):
        return self.title

    objects = models.Manager()  # 默认的管理器
    published = PublishedManager()  # 自定义管理器
    tags = TaggableManager()

    def get_absolute_url(self):
        """返回对象的url"""
        # reverse 方法通过名称和其他参数来构建url
        return reverse("blog:post_detail", args=[self.publish.year, self.publish.month, self.publish.day, self.slug])


class Comment(models.Model):
    post = models.ForeignKey(Post, on_delete=models.CASCADE, related_name="comments")
    name = models.CharField(max_length=80)
    email = models.EmailField()
    body = models.TextField()
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)
    active = models.BooleanField(default=True)

    class Meta:
        db_table = "comments"
        verbose_name = verbose_name_plural = "评论"

